package com.sky.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.sky.domain.PmsAttrGroup;
import com.sky.service.PmsAttrGroupService;
import com.sky.service.PmsCategoryService;
import com.sky.utils.PageQuery;
import com.sky.utils.R;
import com.sky.valid.addGroup;
import com.sky.valid.updateGroup;
import com.sky.vo.request.GroupWithAttrVO;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@RestController
@RequestMapping("/pmsAttrGroup")
/**
 * 商品属性分组控制器，负责处理与商品属性分组相关的HTTP请求。
 */
public class PmsAttrGroupController {

    @Resource
    private PmsAttrGroupService pmsAttrGroupService;
    @Resource
    private PmsCategoryService pmsCategoryService;

    /**
     * 分页查询商品属性分组信息。
     *
     * @param param 包含分页信息和查询条件的请求体。
     * @return 返回分页查询结果。
     */
    @PostMapping("/page")
    public R page(@RequestBody PageQuery<PmsAttrGroup> param){
        IPage<PmsAttrGroup> brandPage = pmsAttrGroupService.queryPage(param);
        return R.ok(brandPage);
    }

    /**
     * 根据ID获取商品属性分组信息。
     *
     * @param attrGroupId 商品属性分组ID。
     * @return 返回指定ID的商品属性分组信息。
     */
    @GetMapping("/getById/{attrGroupId}")
    public R getById(@PathVariable("attrGroupId") Long attrGroupId){
        PmsAttrGroup pmsAttrGroup = pmsAttrGroupService.getById(attrGroupId);
        List<Long> path = pmsCategoryService.getPath(pmsAttrGroup.getCatalogId(), new ArrayList<>());
        pmsAttrGroup.setCategoryPath(path);
        return R.ok(pmsAttrGroup);
    }

    /**
     * 添加新的商品属性分组。
     *
     * @param pmsAttrGroup 新的商品属性分组信息。
     * @return 返回添加结果，成功返回OK，失败返回错误信息。
     */
    @PostMapping("/add")
    public R add(@Validated(addGroup.class) @RequestBody PmsAttrGroup pmsAttrGroup){
        boolean save = pmsAttrGroupService.save(pmsAttrGroup);
        return save ? R.ok() : R.error();
    }

    /**
     * 更新现有的商品属性分组信息。
     *
     * @param pmsAttrGroup 更新后的商品属性分组信息。
     * @return 返回更新结果，成功返回OK，失败返回错误信息。
     */
    @PostMapping("/update")
    public R update(@Validated(updateGroup.class) @RequestBody PmsAttrGroup pmsAttrGroup){
        boolean update = pmsAttrGroupService.updateById(pmsAttrGroup);
        return update ? R.ok() : R.error();
    }

    /**
     * 删除指定的商品属性分组。
     *
     * @param brandIds 要删除的商品属性分组ID数组。
     * @return 返回删除结果，成功返回OK，失败返回错误信息。
     */
    @DeleteMapping("/delete")
    public R delete(@RequestBody Long[] brandIds){
        boolean remove = pmsAttrGroupService.removeBatchByIds(Arrays.asList(brandIds));
        return remove ? R.ok() : R.error();
    }

    /**
     * 根据分类ID获取属性分组及其属性信息
     *
     * @param catalogId 商品分类ID，路径参数
     * @return R 返回结果对象，包含属性分组及其属性信息的列表
     *
     * @GetMapping 通过GET请求映射URL "getGroupWithAttrByCategoryId/{catelogId}"
     * 该方法用于根据指定的分类ID，从数据库中查询并返回该分类下的属性分组及其属性信息。
     * 使用@PathVariable注解将URL路径中的{catelogId}绑定到方法参数catelogId上，
     * 以便在查询过程中使用该ID作为条件。
     */
    @GetMapping("/getGroupWithAttrByCategoryId/{catalogId}")
    public R getGroupWithAttrByCategoryId(@PathVariable("catalogId") Long catalogId){
        // 调用pmsAttrGroupService服务，查询指定分类ID下的属性分组及其属性信息
        List<GroupWithAttrVO> list = pmsAttrGroupService.getGroupWithAttrByCategoryId(catalogId);
        // 返回查询结果，将属性分组及其属性信息的列表封装在R对象中返回
        return R.ok(list);
    }
}
